package com.example.project.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * 通用Builder工具类 提供链式调用的Builder模式实现
 * 
 * @param <T> 要构建的对象类型
 */
public class GenericBuilder<T> {

	private final Supplier<T> instantiator;
	private final List<Consumer<T>> modifiers = new ArrayList<>();

	/**
	 * 私有构造方法
	 * 
	 * @param instantiator 对象实例化器
	 */
	private GenericBuilder(Supplier<T> instantiator) {
		this.instantiator = instantiator;
	}

	/**
	 * 创建GenericBuilder实例
	 * 
	 * @param <T>          要构建的对象类型
	 * @param instantiator 对象实例化器
	 * @return GenericBuilder实例
	 */
	public static <T> GenericBuilder<T> of(Supplier<T> instantiator) {
		return new GenericBuilder<>(instantiator);
	}

	/**
	 * 设置对象属性
	 * 
	 * @param <U>      属性值类型
	 * @param consumer 属性设置器
	 * @param value    属性值
	 * @return 当前GenericBuilder实例
	 */
	public <U> GenericBuilder<T> with(BiConsumer<T, U> consumer, U value) {
		Consumer<T> c = instance -> consumer.accept(instance, value);
		modifiers.add(c);
		return this;
	}

	/**
	 * 构建对象
	 * 
	 * @return 构建完成的对象
	 */
	public T build() {
		T value = instantiator.get();
		modifiers.forEach(modifier -> modifier.accept(value));
		modifiers.clear();
		return value;
	}

	/**
	 * 为特定类型创建链式调用方法
	 * 使用示例：UserInfoResponse.builder().userId("123").userName("test").build()
	 * 
	 * @param <U>    属性值类型
	 * @param setter 属性设置器方法
	 * @param value  属性值
	 * @return 当前GenericBuilder实例
	 */
	public <U> GenericBuilder<T> chain(BiConsumer<T, U> setter, U value) {
		return with(setter, value);
	}
}